#pragma once
#include "GLShaders.h"
#include <QDebug>
#include <QOpenGLDebugLogger>
#include <QOpenGLFunctions>
#include <QOpenGLFunctions_3_3_Core>
#include <QOpenGLShader>
#include <QOpenGLShaderProgram>
#include <QOpenGLTexture>
#include <QSurfaceFormat>
#include <QVector2D>
#include <QVector3D>
#define GL_Major_Version 3
#define GL_Minor_Version 3

#define GL_Core_Mode

// #define OpenGL_ES

// GL_FUN宏: 定义OpenGL函数版本, 项目中所有OpenGL函数调用都继承于此
#define GL_FUN QOpenGLFunctions_3_3_Core

static QSurfaceFormat inline getGLFormat()
{
	QSurfaceFormat fmt;

	// OpenGL 版本 330
	fmt.setVersion(GL_Major_Version, GL_Minor_Version);

#ifdef DEBUG_GL
	fmt.setOption(QSurfaceFormat::DebugContext);
#endif

#ifdef GL_Core_Mode
	// Core 模式, 相对的还有兼容模式。兼容模式支持旧版本的函数和功能，臃肿一些。核心模式不支持旧的函数和功能，轻量一些。
	fmt.setProfile(QSurfaceFormat::CoreProfile);
#endif

	// PC 系统默认使用OpenGL， 嵌入式系统应该使用 OpenGL ES
#ifdef GLES
	fmt.setRenderableType(QSurfaceFormat::OpenGLES);
#else
	fmt.setRenderableType(QSurfaceFormat::OpenGL);
#endif

	fmt.setDepthBufferSize(16);
	fmt.setSamples(8);

	return fmt;
}

static QOpenGLTexture* genTexture(const QImage& image)
{
	auto texture = new QOpenGLTexture(image);
	texture->setMinificationFilter(QOpenGLTexture::Nearest);
	texture->setMagnificationFilter(QOpenGLTexture::Nearest);
	texture->setWrapMode(QOpenGLTexture::Repeat);
	return texture;
}
static QOpenGLTexture* genTexture(const QString& path)
{
	auto img = QImage(path).mirrored();
	return genTexture(img);
}
template <typename ShaderSourceType>
static void genShaderProgram(QOpenGLShaderProgram*& program)
{
	program = new QOpenGLShaderProgram();
	program->addShaderFromSourceCode(QOpenGLShader::Vertex, ShaderSourceType::sVertexShader);
	program->addShaderFromSourceCode(QOpenGLShader::Fragment, ShaderSourceType::sFragmentShader);
	if (!program->link())
	{
		qWarning() << program->log();
	}
}
